网易云信 多窗口合并功能升级说明
云信多窗口合并功能简介
根据一些客户反映的需求,一些情况下会话窗口过多时导致界面比较混乱,为了方便管理多个会话窗口的显示效果,希望增加多会话窗口合并功能。现在已经增加了该功能,但是由于代码改动较大,为了帮助使用旧版本PC Demo的客户顺利增加多窗口合并功能,特意写下升级说明,说明如何在旧代码的基础上增加多窗口合并功能。
多窗口合并功能结构
在旧版本的结构里,一会会话窗口代表一个唯一的会话(P2P或群组会话),与这个会话相关的功能和事件回调都与这个会话窗口绑定在一起。会话窗口对应的XML包含了会话需要的控件信息。也就是会话与会话窗口是对应的关系。
而新版本的结构,为了多窗口合并的需求,一个窗口里面可以容纳下多个会话。这也就导致了许多代码需要改变,不能把会话相关的功能与窗口绑定在一起。现在会话窗口与会话是包含关系。现在把会话窗口与会话拆分为两部分:会话盒子、会话窗口。一个会话的界面内容称之为会话盒子
,一个会话窗口可以包含多个会话盒子
。
在旧版本里,会话功能对应的类为SessionForm
,父类是WindowEx
;而在新版本里,把会话功能对应的类为SessionBox
(会话盒子),父类为VBox
,会话窗口对应的类为SessionForm
,父类是WindowEx
。旧版本的SessionForm
功能都修改到SessionBox
,而新版的SessionForm
几乎不包含会话相关的功能,新版的SessionForm
作为SessionBox
的容器来管理和维护SessionBox
。
需要修改的代码
- UIKIT下原本所有使用
SessionForm
类的代码全部替换为SessionBox
,这个可以使用全局替换功能 SessionManager::GetInstance()->Find()
改名为SessionManager::GetInstance()->FindSessionBox()
原本使用
WindowsManager::GetInstance()->GetWindow()
方法查找会话窗口的代码全部改成SessionManager::GetInstance()->FindSessionBox()
来查找。这个很重要,因为现在的SessionForm已经不具备会话相关的功能了。SessionManager::GetInstance()->OpenSessionForm()
改名为SessionManager::GetInstance()->OpenSessionBox()
SessionBox
类继承VBox
类SessionBox
类增加SetSessionForm
、GetSessionForm
方法SessionBox
类的InitWindow
方法改为InitSessionBox
方法SessionBox
类的OnFinalMessage
方法改为UninitSessionBox
方法SessionBox
类中关于需要使用窗体句柄的地方重新修改SessionBox
类中关于修改窗口标题
、修改窗口任务栏图标
、闪动任务栏
、修改窗口尺寸
等与窗口有关的操作都要传递给SessionForm
去做
需要改动的文件
其中改动最多的代码其中在:
tool_kits\ui_component\ui_kit\gui\session
目录下session_form开头的文件
tool_kits\ui_component\ui_kit\gui\session
目录下session_box开头的文件
tool_kits\ui_component\ui_kit\module\session
目录下session_manager开头的文件
Duilib增加的文件
云信Duilib
修改了Control
、Window
、RichEdit
组件
其中Control
增加了DetachEvent
方法,用于释放某个事件对应的的消息处理器
RichEdit
重写了了SetWindow
方法,用于重新注册RichEdit所属的窗口
UIKIT增加的文件
- 在
tool_kits\ui_component\ui_kit\module\dragdrop
目录中增加drag_drop.h
、drag_drop.cpp
文件 - 在
tool_kits\ui_component\ui_kit\gui\session\dragdrop
目录中增加drag_form.h
、drag_form.cpp
、bitmap_control.cpp
、bitmap_control.cpp
文件 - 在
tool_kits\ui_component\ui_kit\gui\session\control
目录中增加merge_item.h
、merge_item.cpp
文件 tool_kits\ui_component\ui_kit\gui\session
目录中的原session_form
开头的文件改为session_box
开头- 在
tool_kits\ui_component\ui_kit\gui\session
目录中增加session_form.h
、session_form.cpp
、session_form_dragdrop.cpp
文件
XML增加的文件
在bin\themes\default\session
目录中增加了drag_form.xml
、merge_item.xml
、session_form.xml
把原本的session.xml
改为session_box.xml
session_box.xml
中的名为closebtn
和minbtn
的按钮改名为btn_close
和btn_min
开启或关闭多窗口合并功能
tool_kits\ui_component\ui_kit\export
目录中的nim_ui_session_manager.h文件对应uikit
导出的SessionManager
类,其中新增了SetEnableMerge
、IsEnableMerge
、SetUseCustomDragImage
、IsUseCustomDragImage
等函数。
通过调用SetEnableMerge
函数可以开启或者关闭多窗口合并功能,默认为开启。如果关闭了多窗口合并功能,那么会话窗口的行为和外观就和老版本的一致了。
示例代码如下:
nim_ui::SessionManager::GetInstance()->SetEnableMerge(false);
多窗口合并功能注意点
在拖拽会话盒子时,会出现一个拖拽的缩略图效果。这个缩略图的实现方法有两个:
- 使用系统的拖拽效果接口,好处是兼容性好;缺点是如果拖拽到其他程序的窗口上,如果对方窗口不支持拖入,那么拖拽效果图就会消失,影响外观。
- 使用自定的拖拽效果接口,好处是在任何情况下都可以顺利显示拖拽效果,并且可以通过修改代码自定义拖拽的效果;缺点是拖拽的实现用到了低级键盘钩子,一些安全软件会拦截我们的程序,如果使用自定义拖拽效果需要申请去对应的安全软件里申请白名单。
默认情况下开启了自定义拖拽效果,开启或关闭自定义拖拽效果示例如下代码如下:
nim_ui::SessionManager::GetInstance()->SetUseCustomDragImage(false);